package com.ruoyi.ldzlsb.service;

import java.util.List;
import java.util.Map;
import com.ruoyi.ldzlsb.domain.SbEquipmentType;

/**
 * 设备类型Service接口
 * 
 * @author ruoyi
 * @date 2025-06-24
 */
public interface ISbEquipmentTypeService 
{
    /**
     * 查询设备类型
     * 
     * @param typeId 设备类型主键
     * @return 设备类型
     */
    public SbEquipmentType selectSbEquipmentTypeByTypeId(Long typeId);

    /**
     * 查询设备类型列表
     * 
     * @param sbEquipmentType 设备类型
     * @return 设备类型集合
     */
    public List<SbEquipmentType> selectSbEquipmentTypeList(SbEquipmentType sbEquipmentType);

    /**
     * 新增设备类型
     * 
     * @param sbEquipmentType 设备类型
     * @return 结果
     */
    public int insertSbEquipmentType(SbEquipmentType sbEquipmentType);

    /**
     * 修改设备类型
     * 
     * @param sbEquipmentType 设备类型
     * @return 结果
     */
    public int updateSbEquipmentType(SbEquipmentType sbEquipmentType);

    /**
     * 批量删除设备类型
     * 
     * @param typeIds 需要删除的设备类型主键集合
     * @return 结果
     */
    public int deleteSbEquipmentTypeByTypeIds(Long[] typeIds);

    /**
     * 删除设备类型信息
     * 
     * @param typeId 设备类型主键
     * @return 结果
     */
    public int deleteSbEquipmentTypeByTypeId(Long typeId);
    
    /**
     * 获取设备类型树形结构
     * 
     * @return 设备类型树形数据
     */
    public List<Map<String, Object>> getEquipmentTypeTree();
    
    /**
     * 检查设备类型编码是否已存在
     * 
     * @param typeCode 设备类型编码
     * @return 结果
     */
    public boolean checkTypeCodeExists(String typeCode);
    
    /**
     * 检查设备类型编码是否已存在（排除当前ID）
     * 
     * @param typeCode 设备类型编码
     * @param typeId 当前设备类型ID
     * @return 结果
     */
    public boolean checkTypeCodeExistsExcludeSelf(String typeCode, Long typeId);
    
    /**
     * 生成设备类型编码
     * 
     * @return 结果
     */
    public String generateTypeCode();
    
    /**
     * 根据类型名称生成编码
     * 
     * @param typeName 类型名称
     * @return 生成的类型编码
     */
    public String generateTypeCodeFromName(String typeName);
    
    /**
     * 更新设备类型状态
     * 
     * @param sbEquipmentType 设备类型
     * @return 结果
     */
    public int updateSbEquipmentTypeStatus(SbEquipmentType sbEquipmentType);
    
    /**
     * 检查设备类型是否可以删除
     * 
     * @param typeId 设备类型ID
     * @return 检查结果（包含是否可删除、设备数量等信息）
     */
    public Map<String, Object> checkCanDelete(Long typeId);

    /**
     * 检查设备类型是否可以停用
     * 1. 检查是否有非报废状态的设备
     * 2. 检查是否有启用状态的子类型
     * 
     * @param typeId 设备类型ID
     * @return 检查结果，包含是否可以停用、原因等信息
     */
    public Map<String, Object> checkCanDisable(Long typeId);
    
    /**
     * 检查设备类型下是否有非报废状态的设备
     * 
     * @param typeId 设备类型ID
     * @return 非报废设备数量
     */
    public int countNonScrapEquipmentByTypeId(Long typeId);
    
    /**
     * 检查设备类型下是否有报废状态的设备
     * 
     * @param typeId 设备类型ID
     * @return 报废设备数量
     */
    public int countScrapEquipmentByTypeId(Long typeId);

    /**
     * 根据父类型ID查询子类型列表
     * 
     * @param parentId 父类型ID
     * @return 子类型列表
     */
    public List<SbEquipmentType> selectChildTypesByParentId(Long parentId);
}
